/*
 * Pattern: Proxy
 * Является суррогатом другого объекта и контролирует доступ к нему.
 */
package patterns;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

import static java.util.Arrays.asList;

public class ProxyTest {

    public static void main(String[] args) {
        List proxyList = wrapList(new ArrayList(), "add", "toString");
        proxyList.add(10);
        proxyList.add(20);
        proxyList.add(30);
        System.out.println(proxyList);
       // proxyList.remove(1);
    }

    private static List wrapList(final List list,
            final String... allowedMethods) {
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(
                    Object proxy, Method method, Object[] args)
                    throws Throwable {
                if (asList(allowedMethods).contains(method.getName())) {
                    return method.invoke(list, args);
                } else {
                    throw new SecurityException("Access denied!");
                }
            }
        };
        return (List) Proxy.newProxyInstance(
                ProxyTest.class.getClassLoader(),
                new Class[]{List.class},
                handler);
    }
}